package com.code.commons.util;

import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;

/**
 * BigDecimal计算工具类
 *
 * @author tangyifei
 */
public class BigDecimalUtils {

    /**
     * 传的对象不存在则默认值为0
     *
     * @param obj
     * @return
     */
    public static BigDecimal defaultZero(Object obj) {
        if (ObjectUtils.isEmpty(obj)) {
            return BigDecimal.ZERO;
        }
        return new BigDecimal(String.valueOf(obj));
    }

    /**
     * 计算两个数相加
     *
     * @param s1
     * @param s2
     * @return
     */
    public static BigDecimal add(String s1, String s2) {
        return defaultZero(s1).add(defaultZero(s2));
    }

    public static BigDecimal add(BigDecimal bigDecimal, String s2) {
        BigDecimal b1 = bigDecimal == null ? BigDecimal.ZERO : bigDecimal;
        BigDecimal b2 = defaultZero(s2);
        return b1.add(b2);
    }

    /**
     * 计算两个数相加并且保留两位小数
     *
     * @param s1
     * @param s2
     * @return
     */
    public static String addReturnString(String s1, String s2) {
        return retainTwoDecimal(add(s1, s2)).toString();
    }

    /**
     * 计算两个数相减
     *
     * @param s1
     * @param s2
     * @return
     */
    public static BigDecimal subtract(String s1, String s2) {
        return defaultZero(s1).subtract(defaultZero(s2));
    }

    /**
     * 计算两个数相减并且保留两位小数
     *
     * @param s1
     * @param s2
     * @return
     */
    public static String subtractReturnString(String s1, String s2) {
        return retainTwoDecimal(subtract(s1, s2)).toString();
    }

    /**
     * 对BigDecimal四舍五入保留两位小数
     *
     * @param bigDecimal
     * @return
     */
    public static BigDecimal retainTwoDecimal(BigDecimal bigDecimal) {
        if (bigDecimal != null) {
            return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
        }
        return null;
    }

    /**
     * 计算两个数相乘
     *
     * @param s1
     * @param s2
     * @return
     */
    public static BigDecimal multiply(String s1, String s2) {
        return defaultZero(s1).multiply(defaultZero(s2));
    }

    /**
     * 计算两个数相乘并且保留两位小数
     *
     * @param s1
     * @param s2
     * @return
     */
    public static String multiplyReturnString(String s1, String s2) {
        return retainTwoDecimal(multiply(s1, s2)).toString();
    }

    /**
     * 计算两个数相除
     *
     * @param s1
     * @param s2
     * @return
     */
    public static BigDecimal divide(String s1, String s2) {
        return defaultZero(s1).divide(defaultZero(s2), 2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 保留两位小数
     *
     * @param s
     * @return
     */
    public static String keepTwoDecimalPlaces(String s) {
        return defaultZero(s).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 保留4位小数
     *
     * @param s     字符串金额
     * @param scale 保留的小数位数
     * @return
     */
    public static BigDecimal keepDecimalPlaces(BigDecimal s, int scale) {
        if (null == s) {
            return BigDecimal.ZERO;
        }
        return s.setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算两个数相除并且保留两位小数
     *
     * @param s1
     * @param s2
     * @return
     */
    public static String divideReturnString(String s1, String s2) {
        return divide(s1, s2).toString();
    }


    /**
     * 人民币与各国其他货币之间的转换（参考http://www.debugease.com/j2se/289065.html）
     *
     * @param exchangeRate 汇率值
     * @param money        货币金额
     * @return 转化后人民币的金额
     */
    public static BigDecimal rmbTransferOtherDollar(String exchangeRate, String money) {
        if (!StringUtils.isEmpty(exchangeRate) && !StringUtils.isEmpty(money)) {
            return new BigDecimal(exchangeRate).divide(new BigDecimal(100)).multiply(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_UP);
        }
        return null;
    }

    /**
     * 人民币与各国其他货币之间的转换（参考http://www.debugease.com/j2se/289065.html）
     *
     * @param exchangeRate 汇率值
     * @param money        人民币金额
     * @return 转化后其他货币金额
     */
    public static BigDecimal otherDollarTransferRmb(String exchangeRate, String money) {
        if (!StringUtils.isEmpty(exchangeRate) && !StringUtils.isEmpty(money)) {
            BigDecimal b1 = new BigDecimal(exchangeRate).divide(new BigDecimal(100));
            return new BigDecimal(money).divide(b1).setScale(2, BigDecimal.ROUND_HALF_UP);
        }
        return null;
    }

}
